iT邦幫忙

2022 iThome 鐵人賽

DAY 2
0
自我挑戰組

Unity 基本功能實作與日常紀錄系列 第 2

Day2: Counter and Show Current DateTime

  • 分享至 

  • xImage
  •  

平時我們會使用到計數器來幫助我們進行事情的調用,比如說某件事執行多久要停止,每件事情要花多久時間等等,都會需要使用到計數器。
最近做的一些專案都會需要使用Counter來了解一件事完成的程度,與確認是否在某一時間下切換到另外一個Function,或是給定一個時間來判定當前User 的姿態等,可以說計數的重要性不容小覷。而最近的資料也需要做傳出到.csv 檔儲存,故需要紀錄資料存取當下的時間點,所以這邊我也會做說明如何print出我們想要的日期、時間顯示方式。
今天完成的項目有:

  1. 計數 (顯示時候以小數點第二位表示)
  2. 開始計數與重置歸零
  3. 顯示當前日期與時間
  4. 基本Text UI物件顯示

首先: 若不清楚Unity 與 Virtual Studio Code 串接使用,歡迎先到以下的連結參考該做法。
https://youtu.be/4WWX2_tZu5Q

計數器

  1. 首先我們設定 Text 在環境上,如以下結果。可以發現新增一個 Text 時Unity 會自行新增Canvas、EventSystem,Canvas 就是排版起初的版面,上面可以新增各項UI的物件,而EventSystem 是負責每個UI物件事件與觸發的控制。

  2. 接下來按右鍵盤新增一個Empty 物件在Hierarchy。並且新增一個文本 TimeControl.cs

  3. 接下來開始撰寫文本。首先若要使用UI物件就需要先 using UnityEngine.UI 。以下程式碼是當按下鍵盤 p 鍵的時候會開始計數( startBool = true ),若歸零則按下l 鍵,並重新等待按下 p 鍵執行。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class TimeControl : MonoBehaviour
{
    public Text counterTxt;
    private float count;
    private bool startBool = false;
    
    void Start() 
    {
         counterTxt.text = "0";
    }

    void Update() 
    {
        if(Input.GetKeyDown("p"))
        {
            startBool = true;
        }else if(Input.GetKeyDown("l"))         // reset the counter
        {
            count = 0f;
            startBool = false;
        }

        if(startBool)
        {
            startCount();
        }

    }

		
    void startCount()
    {
        count += Time.deltaTime;
        double k = Math.Round(count, 2);
        counterTxt.text = k.ToString();
    }
    
}
  1. 最後回到Unity 將其我們新增的Text拉入到 TimeManagement 中的 TimeControl.cs 元素上面。

  2. 執行後就會看到Unity 中的 Text 會開始計數。

顯示當前時間(年月日時分秒)

  1. 首先撰寫該 TimeControl.cs 的程式碼,新增一個方法 ShowNowTime。我們透過 PlayerPrefs.SetString 取得當前系統的時間並且設定成 yyyy/MM/dd HH:mm:ss 的形式,這個形式可以任意調整,但是要注意到該 yyyy, MM, dd, HH, mm, ss 是不可變的。 我們這邊就是回傳一個字串來顯示當前的時間。
    void ShowNowTime()
    {
        currentTime.text = getNowTime(); 
    }

    string getNowTime()
    {
        PlayerPrefs.SetString("date time", System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
        return PlayerPrefs.GetString("date time");
    }

  1. 整體的程式碼如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;

public class TimeControl : MonoBehaviour
{
    public Text counterTxt;
    public Text currentTime;
    private float count;
    private bool startBool = false;
    
    void Start() 
    {
         counterTxt.text = "0";
    }

    void Update() 
    {
        if(Input.GetKeyDown("p"))
        {
            startBool = true;
        }else if(Input.GetKeyDown("l"))         // reset the counter
        {
            count = 0f;
            startBool = false;
        }

        if(startBool)
        {
            startCount();
        }

        // show the currentTime
        ShowNowTime();

    }

    void startCount()
    {
        count += Time.deltaTime;
        double k = Math.Round(count, 2);               // need to show like 10.03f
        counterTxt.text = k.ToString();
    }

    
    void ShowNowTime()
    {
        currentTime.text = getNowTime(); 
    }

    string getNowTime()
    {
        PlayerPrefs.SetString("date time", System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
        return PlayerPrefs.GetString("date time");
    }
    
}
  1. 回到 Unity 將我們位於Hierarchy 中的 Text拉入到我們的 Script 中。

  2. 最後就可以執行觀察結果 >< Great!

總結

  1. 任何使用到 UI 物件的時候,需要引入 using UnityEngine.UI。
  2. 每當撰寫 public 得公用變數時,回到Unity需要注意到該Script 的位置是否要放入任何對應的物件與變數數值。很重要否則系統會找不到你需要使用的物件或起始數值是多少。
  3. 取小數點第幾位的方式今天也有做說明。

在這感謝各位瀏覽的IT大大,如果有什麼更好的建議或是也有想分享的技術歡迎留言,能瀏覽到我的文章或許就是一種緣分! 若您也對多媒體互動相關領域的朋友也歡迎指教!


上一篇
Day1: 參賽動機
下一篇
Day3: GetComponent from Object
系列文
Unity 基本功能實作與日常紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言